AWS CLI で特定のタグが付与されていないリソースを取得する方法
困っていた内容
Q. AWS CLI コマンド aws resourcegroupstaggingapi get-resources
で「特定のタグが付与されていない」リソースを取得する方法はありますか。「特定のタグが付与されている」条件との併用方法も知りたいです。
どう対応すればいいの?
A. aws resourcegroupstaggingapi get-resources
コマンドに --tag-filters
オプションを使用することで、特定のタグキーと値に基づいてリソースをフィルタリングできますが、特定のタグが付与されていないリソースを直接フィルタリングすることはできません。そのため、まずは条件に一致するリソースを取得し、その後で指定のタグが付与されていないリソースをスクリプトやプログラムで別途除外する必要があります。
やってみた
例えば、「タグキーに Name が付与されている」かつ「タグキーに Environment が付与されていない」リソースを取得してみます。
1. Name タグが付与されているリソースを取得します
まず、Name タグが付与されているリソースを取得するコマンドは以下のようになります。
aws resourcegroupstaggingapi get-resources --tag-filters Key=Name --region ap-northeast-1
このコマンドは、Name タグが付与されているすべてのリソースのリストを返します。
ちなみに、特定のタグが付与された AWS リソース一覧を取得する方法については、以下のエントリで詳しく紹介されています。
2. 取得したリソースのリストから、Environment タグが付与されているものを除外します
例えば jq コマンドで処理する場合は以下のようになります。
aws resourcegroupstaggingapi get-resources --tag-filters Key=Name --region ap-northeast-1 --output json | jq '.ResourceTagMappingList | map(select(.Tags | all(.Key != "Environment")))'
処理としては、前項 1 で取得した出力の中の ResourceTagMappingList
プロパティにアクセスし、リソースタグの中で全てのタグのキーが "Environment" でない条件に一致する要素のみを選択して返すようにしています。
最終的に出力される結果は以下のように "Name" タグが付いているが "Environment" タグが付いていないリソースの一覧になります。
{ "ResourceTagMappingList": [ { "ResourceARN": "arn:aws:ec2:ap-northeast-1:012345678910:instance/i-xxxxxxxxxxxxxxxxx", "Tags": [ { "Key": "Owner", "Value": "hoge" }, { "Key": "Name", "Value": "test-instance" } ] } ] }